package com.itheima.d2_reflect;

import org.junit.Test;

import java.lang.reflect.Field;

/*
     目标：掌握获取类的成员变量，并对其进行操作。

     Class类中方法
        public Field[] getFields()	获取类的全部成员变量（只能获取public修饰的）
        public Field[] getDeclaredFields()	获取类的全部成员变量（只要存在就能拿到）
        public Field getField(String name)	获取类的某个成员变量（只能获取public修饰的）
        public Field getDeclaredField(String name)	获取类的某个成员变量（只要存在就能拿到）
    Field类中的方法
        void set(Object obj, Object value)：	赋值
        Object get(Object obj)	取值
        public void  setAccessible(boolean flag)	设置为true，表示禁止检查访问控制（暴力反射）

   需求 : 操作猫类的成员变量
 */
public class Test3Field {
    private Class catClass;

    @Test
    public void testGetFields() throws NoSuchFieldException, IllegalAccessException {
        //成员变量的获取和使用
        Class catClass = Cat.class;
//        public Field[] getFields()	获取类的全部成员变量（只能获取public修饰的）
//        Field[] fields = catClass.getFields();
//        for (Field field : fields) {
//            System.out.println(field);
//        }
        //获取全部的成员变量，只要存在就能拿到
//        Field[] declaredFields = catClass.getDeclaredFields();
//        for (Field declaredField : declaredFields) {
//            System.out.println(declaredField);
//        }
        //获取某一个成员变量，只能是被public修饰的
////        public Field getField(String name)	获取类的某个成员变量（只能获取public修饰的）
//        Field name = catClass.getField("age");
//        System.out.println(name);
        //获取某一个成员变量，只要存在，就能拿到
        Field name = catClass.getDeclaredField("name");
        System.out.println(name);
//        void set(Object obj, Object value)：	赋值
//        Object get(Object obj)	取值
//        public void  setAccessible(boolean flag)	设置为true，表示禁止检查访问控制（暴力反射）
name.setAccessible(true);
        Cat cat = new Cat();

        name.set(cat,"阿米娅");

        System.out.println(name.get(cat));

    }

}
